Redis数据类型

与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型有String、List、Hash、Set和Sorted Set。

Redis内部使用一个redisObject对象来表示所有的key和value,在上图中,type代表一个value对象具体是何种数据类型,encoding是不同数据类型在redis内部的存储方式,比如:type=string代表value存储的是一个普通的字符串,那么对应的encoding可以是raw或者int,如果是int则代表实际redis内部是按数值类型存储和表示这个字符串的,当然前提是这个字符串本身可以用数值表示。

上图中vm字段只有打开了Redis的虚拟内存功能,此字段才会真正的分配内存,该功能默认是关闭状态的。

String类型

字符串是Redis的最基础的类型,Redis中使用的字符串是通过包装的,基于C语言字符数组实现的简单动态字符串(Simple Dynamic String, sds)一个抽象数据结构。

1
2
3
4
5
struct sdshdr {
int len; // len表示buf中存储的字符串的长度
int free; // free表示buf中空闲空间的长度
char buf[]; // buf用来存储字符串内容
};

String是最常用的数据类型,普通的key-value都可以归为此类。

Hash类型

Hash是一个String类型的field和value之间的映射表,即Redis的Hash数据类型的key对应的value实际的内部存储结构是一个HashMap,因此Hash特别适合存储对象。

Hash类型通常用一个对象存储用户信息、商品信息、订单信息等。

List类型

Redis的List类型其实就是每一个元素都是String类型的双向链表,可以从链表的头部和尾部添加或者删除元素,因此,其既可以作为栈,也可以作为队列来使用。

List类型通常用在好友列表、粉丝列表、消息队列、最新消息排行等场合。

Set类型

Redis的Set类型是一个无序的String类型数据的集合,与List不同的是Set不能有重复的数据。实际上,Set内部是用HashMap实现的,Set只用了HashMap的key列来存储对象。

Set类型有取交集、并集、差集等操作,通常用在求共同好友、共同兴趣、分类标签等。